package com.study;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * 布隆过滤器
 * 布隆过滤器是bitmaps数据结构，底层是二进制类型数据，全部都是由0和1组成
 * 初始时所有值都为0，存入数据时进行hash计算，将对应的下标写成1。进行比较时
 * 先计算对应的下表，如果全部为1则代表存在，因为hash值可能会重复因此这种计算方式
 * 也不是百分百准确。我们可以设置准确度，但是准确度设置越高，占用内存越大。
 * 布隆过滤器主要被使用在判断值是否存在的场景中
 * 布隆过滤器的缺点:
 * 1.判断的结果具有误差(说不存在则一定不存在，说存在有可能会不存在)
 * 2.值不能够删除
 * 3.定长
 * @Author ytj
 * @Date 2021/11/14 16:07
 */
@SpringBootTest
@RunWith(SpringRunner.class)
public class BloomFilter {
    @Autowired
    private RedissonClient redissonClient;
    private static final String bloomFilterName="filterTest";

    @Test
    public void filter(){
        RBloomFilter bloomFilter=redissonClient.getBloomFilter(bloomFilterName);
        bloomFilter.tryInit(1000000L,0.01);
        bloomFilter.add("test1");
        bloomFilter.add("test2");
        bloomFilter.add("test3");
        bloomFilter.add("test4");
        bloomFilter.add("test5");
        bloomFilter.add("10086");
        boolean flg1=bloomFilter.contains("12345");
        System.out.println("是否包含12345:"+flg1);
        boolean flg2=bloomFilter.contains("10086");
        System.out.println("是否包含10086:"+flg2);
        boolean flg3=bloomFilter.contains("test");
        System.out.println("是否包含test:"+flg3);
    }

    @Test
    public void filter2(){
        RBloomFilter bloomFilter=redissonClient.getBloomFilter(bloomFilterName);
        bloomFilter.tryInit(1000000L,0.01);
        int trueCount=0;
        int falseCount=0;
        for(int i=0;i<1000000;i++){
            bloomFilter.add(i);
            boolean flg=bloomFilter.contains(i);
            if(flg){
                trueCount++;
            }else{
                falseCount++;
            }
        }
        System.out.println("trueCount:"+trueCount);
        System.out.println("falseCount:"+falseCount);
    }
}
